/*
 * SoftwareSAR - 1.0
 */
package br.com.cpqd.ssar.utilitarias;

import java.awt.Color;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultComboBoxModel;

/**
 * Classe que armazena a lista de fontes eletromagneticas inseridas na simulacao pelo usuario
 * @author Carlos H. S. Santos
 * @version 1.0
 */
public class ListaFontesEletromagneticas {

    /*
     * Lista com as fontes eletromagneticas cadastradas pelos usuarios
     */
    private Vector listaFontes;
    /**
     * Modelo para apresentação na Combo Box
     * Guarda a lista de materiais cadastrados pelo software e pelo usuário
     */
    private DefaultComboBoxModel modelo;
    /**
     * Modelo para apresentação na Combo Box
     * Guarda a lista de materiais cadastrados pelo usuário
     */
    private DefaultComboBoxModel modeloEditavel;
    private ListadeTiposFontesEletromagneticas listaTiposFonte;

    public ListaFontesEletromagneticas() throws IOException {
        int cont;
        TiposdeFonteEletromagnetica tipoFonte;
        modelo = new DefaultComboBoxModel();

        listaTiposFonte = new ListadeTiposFontesEletromagneticas();

        for (cont = 0; cont < listaTiposFonte.getNTypes(); cont++) {
            tipoFonte = new TiposdeFonteEletromagnetica();
            tipoFonte = listaTiposFonte.getSourceType(cont);
            if (tipoFonte.getNParameters() > 0) {
                modelo.addElement(tipoFonte);
            }
        }
        // Carrega Arquivos de Materiais do Programa
        carregarListaFontes();
    }

    /**
     * Carrega a lista de fontes eletromagnéticas com as inseridas no arquivo de usuário,
     * sincronizando a lista com o arrquivo
     */
    private void carregarListaFontes() throws IOException {
        // Tipos de fontes eletromagneticos
        listaFontes = new Vector(); // Cadastramento e Listamento geral de fontes inseridas pelos usuários
        String linha = new String();
        modeloEditavel = new DefaultComboBoxModel();

        FonteEletromagnetica fonte;
        TiposdeFonteEletromagnetica tipoFonte;
        Color color;
        int R, G, B, cont;
        int nparameters;
        Vector parameters;

        // Abrir o arquivo de fontes cadastradas pelo usuário e inserir na lista de fontes
        String caminho = System.getProperty("user.dir") + File.separator + "DadosUsuarios" + File.separator + "fonteseletromagneticas.dat";
        System.out.println("Caminho: "+caminho);

        FileInputStream inputStream;
        BufferedReader reader;
        StringTokenizer strToken;
        try {
            inputStream = new FileInputStream(caminho);
            reader = new BufferedReader(new InputStreamReader(inputStream));

            // Lendo as linhas de cabeçalho do arquivo de fontes eletromagnéticas do usuário
            reader.readLine();
            reader.readLine();

            // Lendo a base de dados de fontes eletromagneticas
            while ((linha = reader.readLine()) != null) {

                System.out.println("Linha: " + linha);
                // Tokens
                fonte = new FonteEletromagnetica();
                tipoFonte = new TiposdeFonteEletromagnetica();
                strToken = new StringTokenizer(linha);
                parameters = new Vector();
                // Dados genéricos das fontes eletromagnéticas
                fonte.setIdFonte(Integer.valueOf(strToken.nextToken()));
                fonte.setName(strToken.nextToken());
                fonte.setField(strToken.nextToken());
                fonte.setDirection(strToken.nextToken());
                fonte.setIdType(Integer.valueOf(strToken.nextToken()));
                R = Integer.valueOf(strToken.nextToken());
                G = Integer.valueOf(strToken.nextToken());
                B = Integer.valueOf(strToken.nextToken());
                color = new Color(R, G, B);
                fonte.setColor(color);

                nparameters = Integer.valueOf(strToken.nextToken());
                for (cont = 0; cont < nparameters; cont++) {
                    parameters.add(Double.valueOf(strToken.nextToken()));
                }
                fonte.setParameters(parameters);
                listaFontes.add(fonte);
                modeloEditavel.addElement(fonte);
            }

        } catch (FileNotFoundException ex) {
        }
    }

    /**
     * Inserção de todas as fontes eletromagnéticas do usuário no arquivo de base dados
     * atualizando os dados cadastrados
     * @return boolean
     */
    public boolean salvarFontes() {
        FonteEletromagnetica fonte;
        Vector parameters;

        int cont, i = 0;
        // Carrega Arquivos de Materiais do Usuário
        String cabecalho1 = "--> Cadastramento de Fontes Eletromagnéticas dos Usuários <--";
        String cabecalho2 = "Id\tNome\tCampo\t\tDireção\tIdTipo\tRed\tGreen\tBlue\tNParametros\tParâmetros";
        String caminho = System.getProperty("user.dir") + File.separator + "DadosUsuarios" + File.separator + "fonteseletromagneticas.dat";

        try {
            FileWriter filewriter = new FileWriter(caminho);
            PrintWriter printwriter = new PrintWriter(new BufferedWriter(filewriter));

            // Imprime Primeiro Cabeçalho
            printwriter.println(cabecalho1);
            // Imprime Segundo Cabeçalho
            printwriter.println(cabecalho2);

            for (i = 0; i < listaFontes.size(); i++) {
                fonte = new FonteEletromagnetica();
                parameters = new Vector();
                fonte = (FonteEletromagnetica) listaFontes.get(i);
                printwriter.print(fonte.getIdFonte());                          // Determinando o ID da Fonte Cadastrada
                printwriter.print("\t" + fonte.getName());
                printwriter.print("\t" + fonte.getField());
                printwriter.print("\t" + fonte.getDirection());
                printwriter.print("\t\t" + fonte.getIdType());
                printwriter.print("\t\t" + fonte.getColor().getRed());
                printwriter.print("\t" + fonte.getColor().getGreen());
                printwriter.print("\t" + fonte.getColor().getBlue());
                parameters = fonte.getParameters();
                printwriter.print("\t" + parameters.size() + "\t");
                for (cont = 0; cont < parameters.size(); cont++) {
                    printwriter.print("\t" + parameters.get(cont).toString());
                }
                printwriter.print("\n");
            }
            printwriter.close();
            filewriter.close();
            return true;

        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }

    }

    /**
     * Adicionar Fonte Eletromagnética informada pelo usuário
     * @param fonte FonteEletromagnetica
     * @exception IOException
     */
    public void adicionarFonte(FonteEletromagnetica fonte) throws IOException {
        // Re-inicializa a lista de fontes para sincronizar com o arquivo de dados
        carregarListaFontes();
        fonte.setIdFonte(listaFontes.size() + 1);
        listaFontes.add(fonte);
        salvarFontes();
    }

    /**
     * Editar Fonte Eletromagnética informada pelo usuário
     * @param fonte FonteEletromagnetica
     * @exception IOException
     */
    public void editarFonte(FonteEletromagnetica fonte) throws IOException {
        carregarListaFontes();      // Sincronizando base de dados e a edicao
        listaFontes.setElementAt(fonte, fonte.getIdFonte() - 1);
        salvarFontes();
    }

    /**
     * Removendo a Fonte Eletromagnetica do usuário
     * @param fonte FonteEletromagnetica
     */
    public void removerFonte(FonteEletromagnetica fonte) {
        try {
            carregarListaFontes();
            FonteEletromagnetica temp = new FonteEletromagnetica();
            for (int cont=0; cont < listaFontes.size(); cont++) {
                temp=(FonteEletromagnetica) listaFontes.get(cont);
                if (temp.getIdFonte()== fonte.getIdFonte()){
                    listaFontes.remove(temp);
                }
            }               
            salvarFontes();
        } catch (IOException ex) {
            Logger.getLogger(ListaFontesEletromagneticas.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }

    /**
     * Get the value of modelo
     * @return the value of modelo
     */
    public DefaultComboBoxModel getModelo() {
        try {
            carregarListaFontes();
            return modelo;
        } catch (IOException ex) {
            Logger.getLogger(ListaFontesEletromagneticas.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    /**
     * retorna o Combo do Modelo Editavel
     * @return value DefaultComboModel
     */
    public DefaultComboBoxModel getModeloEditavel() {
        try {
            carregarListaFontes();
            return modeloEditavel;
        } catch (IOException ex) {
            Logger.getLogger(ListaFontesEletromagneticas.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    /**
     * Get the value of modeloEditavel
     * @return the value of modelo
     */
    public int size() {
        return listaFontes.size();
    }

    /**
     * Retornar uma Fonte Eletromagnetica da Lista de Fontes Cadastradas pelo Usuario
     * @param id int
     * @return value FonteEletromagnetica
     */
    public FonteEletromagnetica getFonte(int id) {
        return (FonteEletromagnetica) listaFontes.get(id);
    }
    
    /**
     * Retornar a Fonte Eletromagneticas de acordo com seu ID
     * @return index Int
     */
    public FonteEletromagnetica getFonteIndex(int id){
        FonteEletromagnetica temp;
        for (int cont=0; cont < listaFontes.size();cont++){
            temp = new FonteEletromagnetica();
            temp = (FonteEletromagnetica) listaFontes.get(cont);
            if(temp.getIdFonte()==id){
                return temp;
            }
        }
        return null;
    }
}
